import scala.collection.mutable

object Demo15Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map映射：所有的元素都是KV格式的、不可变的、无序的、Key是唯一的
     *
     */
    // 创建一个Map
    val map1: Map[String, Int] = Map[String, Int](("key1", 1), Tuple2("key2", 2), "key3" -> 3)

    println(map1)
    println(map1("key1")) // 传入key获取value

    // Map常见的方法
    println(map1.get("key1")) // 通过key获取value
    println(map1.get("key2")) // 通过key获取value
    println(map1.get("key3")) // 通过key获取value
    println(map1.get("key4")) // 通过key获取value

    /**
     * 在Scala中为了避免直接对None进行调用造成空指针异常的问题
     * 通常会在一些情况中：例如Map中通过Key去获取Value，
     * 如果Key存在那么Value就能够获取到
     * 如果传入的Key不存在那么就没有Value进行返回，
     * 如果直接返回None，很容易造成空指针异常的情况
     * 所以面对有可能有值的情况一般会返回Option类型
     *
     * Option类型有两个子类：Some、None
     * 那么如果在代码中碰到有函数（方法）返回的类型是Option
     * 则需要另行判断是否有值，再做后续的处理
     */
    val maybeInt: Option[Int] = map1.get("key1")

    // 模式匹配 类似Java中的switch
    maybeInt match {
      case Some(v) =>
        println(v)
      case None =>
        println("value不存在")
    }

    // getOrElse 通过key获取value 但是如果key不存在则可以返回默认值 底层也是通过模式匹配实现的
    val v1: Any = map1.getOrElse("key1", "如果key不存在则返回")
    val v2: Any = map1.getOrElse("key2", "如果key不存在则返回")
    val v4: Any = map1.getOrElse("key4", "如果key不存在则返回")

    println(v1)
    println(v2)
    println(v4)

    map1.foreach(println)

    // 对map1中的没有key对应的value做一个平方
    map1.map(kv => {
      val key: String = kv._1
      val value: Int = kv._2
      (key, value * value)
    }).foreach(println)

    // 可变的Map-->HashMap

    val hashMap1: mutable.HashMap[String, String] = mutable.HashMap[String, String]("k1" -> "v1", "k2" -> "v2", "k3" -> "v3")

    println(hashMap1)

    println(hashMap1.get("k1"))
    println(hashMap1.get("k2"))
    println(hashMap1.getOrElse("k4", "默认值"))

    // 增加一组KV
    hashMap1.put("k5", "v5")
    println(hashMap1)

    // 根据key删除KV
    hashMap1.remove("k2")
    println(hashMap1)

    // 根据key修改value
    hashMap1.put("k1", "vv1")
    println(hashMap1)

    // 判断key存不存在
    println(hashMap1.contains("k1"))
    println(hashMap1.contains("kk1"))

  }

}
